import request, { TokenManager } from './request'
import config from '../config'

/**
 * 轮播图服务
 * 提供统一的轮播图获取逻辑，支持token认证和fallback机制
 */
export class BannerService {
  // 默认的本地轮播图
  static DEFAULT_BANNERS = [
    '/src/assets/images/login/首页背景.png',
    '/src/assets/images/login/首页图片2.jpg',
    '/src/assets/images/login/首页图片3.jpg'
  ]

  /**
   * 获取轮播图列表
   * @param {Object} options 配置选项
   * @param {boolean} options.requireAuth 是否需要认证，默认true
   * @param {Array} options.fallbackImages 失败时的备用图片，默认使用DEFAULT_BANNERS
   * @param {string} options.apiEndpoint API端点，默认'/api/v1/admin/banner/list'
   * @returns {Promise<Array>} 轮播图URL数组
   */
  static async getBanners(options = {}) {
    const {
      requireAuth = true,
      fallbackImages = BannerService.DEFAULT_BANNERS,
      apiEndpoint = '/api/api/v1/admin/banner/list'
    } = options

    // 如果需要认证但没有token，直接返回备用图片
    if (requireAuth && !TokenManager.isLoggedIn()) {
      console.log('轮播图服务: 无token，使用备用图片')
      return [...fallbackImages]
    }

    try {
      // 使用统一的request工具，会自动添加token
      const response = await request.get(apiEndpoint)
      console.log('轮播图API响应:', response)
      
      if (response && response.success) {
        // 确保数据是数组
        if (Array.isArray(response.data) && response.data.length > 0) {
          // 处理图片URL，确保完整路径
          const baseUrl = config.baseURL
          const bannerImages = response.data.map(path => {
            // 如果路径已经是完整URL，直接使用
            if (path.startsWith('http://') || path.startsWith('https://')) {
              return path
            }
            // 否则拼接基础URL
            return `${baseUrl}${path.startsWith('/') ? path : '/' + path}`
          })
          
          console.log('轮播图服务: 成功获取', bannerImages.length, '张图片')
          return bannerImages
        } else {
          console.warn('轮播图服务: API返回数据为空，使用备用图片')
          return [...fallbackImages]
        }
      } else {
        console.error('轮播图服务: API调用失败:', response?.message || '未知错误')
        return [...fallbackImages]
      }
    } catch (error) {
      console.error('轮播图服务: 请求异常:', error)
      
      // 如果是401错误，说明token无效
      if (error.response?.status === 401) {
        console.log('轮播图服务: Token无效，使用备用图片')
      }
      
      return [...fallbackImages]
    }
  }

  /**
   * 预加载轮播图
   * @param {Array} imageUrls 图片URL数组
   * @returns {Promise<Array>} 预加载结果数组
   */
  static preloadImages(imageUrls) {
    return Promise.allSettled(
      imageUrls.map(url => {
        return new Promise((resolve, reject) => {
          const img = new Image()
          img.onload = () => resolve({ url, loaded: true })
          img.onerror = () => reject({ url, loaded: false })
          img.src = url
        })
      })
    )
  }

  /**
   * 带预加载的轮播图获取
   * @param {Object} options 配置选项
   * @returns {Promise<Object>} { images: Array, preloadResults: Array }
   */
  static async getBannersWithPreload(options = {}) {
    const images = await BannerService.getBanners(options)
    const preloadResults = await BannerService.preloadImages(images)
    
    return {
      images,
      preloadResults,
      successCount: preloadResults.filter(r => r.status === 'fulfilled').length,
      totalCount: images.length
    }
  }
}

export default BannerService